// cf-385d
// 题意：给定n(<=20)个灯的坐标(xi, yi)(-1000<=xi, yi<=1000)和光线角度di
//       (1<=di<=90)，灯可以任意旋转，求在x轴上要从l到r(l, r<=10^5)，
//       用这些灯最多可以照亮从l出发连续多长的距离。（照到x轴）
//
// 题解：一开始写复杂了。其实只需要一维dp[state]表示目前取了state这些
//       灯最长距离，因为现在给你一个灯，它肯定是在之前最长距离基础下
//       再往右照才能到这个灯照到的最长（这个贪心很好证明，直观理解下
//       就行）。然后就可以转移了。要值得注意的是可能灯会照到正无穷，
//       要特殊处理。
//
// run: time -p $exec < input
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cmath>

int const maxn = 20;
double const pi = std::acos(-1);
double f[(1 << maxn) + 7];
int n, l, r;
double dis;

struct light { int x, y, d; double a, ta; };
light lights[maxn + 7];

double len(double start, int x)
{
	if (lights[x].x >= start) {
		double l = lights[x].x - start;
		double h = lights[x].y;
		double t = l / h;
		double ta = lights[x].ta;
		return l - h * (t - ta) / (1.0 + t * ta);
	} else {
		double l = start - lights[x].x;
		double h = lights[x].y;
		double ta = lights[x].ta;
		double tb = l / h;
		if (ta * tb >= 1) return dis;
		double t = (ta + tb) / (1 - ta * tb);
		return t * h - l;
	}
}

double calc()
{
	int up = 1 << n;
	for (int i = 1; i < up; i++) {
		for (int j = 0; j < n; j++) {
			if (!((1 << j) & i)) continue;
			int tj = i ^ (1 << j);
			f[i] = std::max(f[i], f[tj] + len(l + f[tj], j + 1));
			if (f[i] >= dis) return dis;
		}
	}
	return std::min(dis, f[(1 << n) - 1]);
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> l >> r;
	dis = r - l;
	for (int i = 1; i <= n; i++) {
		std::cin >> lights[i].x >> lights[i].y >> lights[i].d;
		lights[i].a = lights[i].d * pi / 180.0;
		lights[i].ta = std::tan(lights[i].a);
	}
	std::cout << std::fixed << std::setprecision(10) << calc() << '\n';
}

